package br.ufes.ceunes.poo.view.cadastros;

import br.ufes.ceunes.poo.model.dao.DAOGenerico;
import br.ufes.ceunes.poo.model.dao.PedidoDAO;
import br.ufes.ceunes.poo.model.dao.ProdutoDAO;
import br.ufes.ceunes.poo.model.pojo.Pedido;
import br.ufes.ceunes.poo.model.pojo.Produto;
import br.ufes.ceunes.poo.util.JPAUtil;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.persistence.EntityManager;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author user
 */
public class CadastroPedido extends javax.swing.JFrame {

    private DAOGenerico daoProduto;
    private DAOGenerico daoPedido;
    private Pedido pedido;

    public CadastroPedido() {
        initComponents();
        daoProduto = new ProdutoDAO();
        daoPedido = new PedidoDAO();
        bProcurarProduto.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String nome = tBuscaProduto.getText();
                preencherTabelaListaProdutos(((ProdutoDAO) daoProduto).buscaPorNome(nome));
            }

        });

        bIncluirProduto.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                DefaultTableModel model = (DefaultTableModel) tableBuscaProduto.getModel();
                DefaultTableModel modelCarrinho = (DefaultTableModel) tableCarrinho.getModel();
                int op = tableBuscaProduto.getSelectedRow();
                String quant_txt = txQuantidade.getText();
                Integer quantidade;
                if (pedido == null) {
                    pedido = new Pedido();
                } /*else {
                 pedido = daoPedido.buscarPorId(op)
                 }*/

                try {
                    quantidade = Integer.parseInt(quant_txt);
                    modelCarrinho.addRow(new Object[]{null, null, null, null});

                    int row = tableBuscaProduto.getSelectedRow();
                    if (row == -1) {
                        JOptionPane.showMessageDialog(new JFrame(), "Selecione um produto.", "Erro", JOptionPane.ERROR_MESSAGE);
                    } else {
                        Produto produto = (Produto) daoProduto.buscarPorId((Integer) tableBuscaProduto.getValueAt(row, 0));
                        pedido.adicionarProduto(produto, quantidade);
                        modelCarrinho.setValueAt(produto.getId(), modelCarrinho.getRowCount() - 1, 0);
                        modelCarrinho.setValueAt(produto.getNome(), modelCarrinho.getRowCount() - 1, 1);
                        modelCarrinho.setValueAt(pedido.getQuantidade(produto), modelCarrinho.getRowCount() - 1, 2);
                        modelCarrinho.setValueAt(produto.getPreco() * pedido.getQuantidade(produto), modelCarrinho.getRowCount() - 1, 3);
                    }
                } catch (NumberFormatException ex) {
                    JOptionPane.showMessageDialog(new JFrame(), "Apenas inteiros na quantidade.", "Erro", JOptionPane.ERROR_MESSAGE);
                }
            }
        });

        bSalvarCarrinho.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (pedido.getId() == null) {
                    daoPedido.salvar(pedido);
                } else {
                    EntityManager i = JPAUtil.getInstance().getEntityManager();
                    i.getTransaction().begin();
                    i.merge(pedido);
                    i.getTransaction().commit();

                }
            }

        });

    }

    private void preencherTabelaListaProdutos(List<Produto> produtos) {
        DefaultTableModel model = (DefaultTableModel) tableBuscaProduto.getModel();
        model.setRowCount(0);
        for (Produto p : produtos) {
            model.addRow(new Object[]{null, null, null, null});
            model.setValueAt(p.getId(), model.getRowCount() - 1, 0);
            model.setValueAt(p.getNome(), model.getRowCount() - 1, 1);
            model.setValueAt(p.getEstoque(), model.getRowCount() - 1, 2);
            model.setValueAt(p.getPreco(), model.getRowCount() - 1, 3);
        }
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        bCheckout = new javax.swing.JButton();
        bCancelar = new javax.swing.JButton();
        tBuscaProduto = new javax.swing.JTextField();
        bIncluirProduto = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        bProcurarProduto = new javax.swing.JButton();
        bSalvarCarrinho = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        tableCarrinho = new javax.swing.JTable();
        jScrollPane2 = new javax.swing.JScrollPane();
        tableBuscaProduto = new javax.swing.JTable();
        jLabel3 = new javax.swing.JLabel();
        txQuantidade = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        bCheckout.setBackground(new java.awt.Color(51, 204, 0));
        bCheckout.setForeground(new java.awt.Color(51, 153, 0));
        bCheckout.setText("Fechar pedido");
        bCheckout.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bCheckoutActionPerformed(evt);
            }
        });

        bCancelar.setBackground(new java.awt.Color(255, 0, 0));
        bCancelar.setForeground(new java.awt.Color(255, 0, 0));
        bCancelar.setText("Cancelar");
        bCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bCancelarActionPerformed(evt);
            }
        });

        tBuscaProduto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tBuscaProdutoActionPerformed(evt);
            }
        });

        bIncluirProduto.setText("INCLUIR");
        bIncluirProduto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bIncluirProdutoActionPerformed(evt);
            }
        });

        jLabel2.setFont(new java.awt.Font("Comic Sans MS", 1, 14)); // NOI18N
        jLabel2.setText("CARRINHO DE COMPRAS");

        bProcurarProduto.setText("PROCURAR");
        bProcurarProduto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bProcurarProdutoActionPerformed(evt);
            }
        });

        bSalvarCarrinho.setText("SALVAR CARRINHO");
        bSalvarCarrinho.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bSalvarCarrinhoActionPerformed(evt);
            }
        });

        tableCarrinho.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "Nome", "Quantidade", "SubValor"
            }
        ));
        jScrollPane1.setViewportView(tableCarrinho);

        tableBuscaProduto.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "Nome", "Quantidade", "Preco Unitario"
            }
        ));
        jScrollPane2.setViewportView(tableBuscaProduto);

        jLabel3.setText("Nome Produto:");

        jLabel4.setText("Quantidade:");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addContainerGap()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 428, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(jLabel3)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(tBuscaProduto, javax.swing.GroupLayout.PREFERRED_SIZE, 251, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(bProcurarProduto))))
                            .addGroup(layout.createSequentialGroup()
                                .addGap(163, 163, 163)
                                .addComponent(bSalvarCarrinho)))
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addGap(133, 133, 133)
                .addComponent(jLabel2)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel4)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txQuantidade, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(bIncluirProduto)
                .addGap(33, 33, 33))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(36, 36, 36)
                .addComponent(bCheckout)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(bCancelar)
                .addGap(52, 52, 52))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tBuscaProduto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bProcurarProduto)
                    .addComponent(jLabel3))
                .addGap(18, 18, 18)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bIncluirProduto)
                    .addComponent(txQuantidade, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(bSalvarCarrinho)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bCancelar)
                    .addComponent(bCheckout))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void bIncluirProdutoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bIncluirProdutoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_bIncluirProdutoActionPerformed

    private void bProcurarProdutoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bProcurarProdutoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_bProcurarProdutoActionPerformed

    private void bSalvarCarrinhoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bSalvarCarrinhoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_bSalvarCarrinhoActionPerformed

    private void tBuscaProdutoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tBuscaProdutoActionPerformed
        tBuscaProduto.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                tBuscaProduto.setText("");
            }
        }
        );
    }//GEN-LAST:event_tBuscaProdutoActionPerformed

    private void bCheckoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bCheckoutActionPerformed
        pedido.setStatus(true);
        daoPedido.salvar(pedido);
    }//GEN-LAST:event_bCheckoutActionPerformed

    private void bCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bCancelarActionPerformed
        dispose();
    }//GEN-LAST:event_bCancelarActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(CadastroPedido.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(CadastroPedido.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(CadastroPedido.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(CadastroPedido.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new CadastroPedido().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton bCancelar;
    private javax.swing.JButton bCheckout;
    private javax.swing.JButton bIncluirProduto;
    private javax.swing.JButton bProcurarProduto;
    private javax.swing.JButton bSalvarCarrinho;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextField tBuscaProduto;
    private javax.swing.JTable tableBuscaProduto;
    private javax.swing.JTable tableCarrinho;
    private javax.swing.JTextField txQuantidade;
    // End of variables declaration//GEN-END:variables
}
